iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0

今天就來細探 Claude 幫我生成的 connection.js 檔案。
這也是我初次使用 MongoDB,過程中發現了不少實用的小技巧。

  1. 匯入 Mongoose
const mongoose = require('mongoose');

Mongoose 是一個 ODM(Object Data Modeling)套件,讓我們可以用 JavaScript 物件的方式操作 MongoDB,而不用直接寫查詢語法。

  1. 建立連線函式
const connectDatabase = async () => {
  try {
    const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/rehab_tracker';

mongoUri:指定資料庫連線字串。

預設是 mongodb://localhost:27017/rehab_tracker(本地端 MongoDB)。

如果專案部署到雲端(例如 MongoDB Atlas),就會用環境變數 MONGODB_URI。

  1. 連線選項
const options = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  maxPoolSize: 10,              // 最多維持 10 個連線
  serverSelectionTimeoutMS: 5000, // 伺服器選擇逾時 5 秒
  socketTimeoutMS: 45000,       // 45 秒沒動作就關閉 socket
  family: 4                     // 強制使用 IPv4
};

選項用途

相容性:useNewUrlParser, useUnifiedTopology
確保使用新版行為,避免舊版警告。

效能:maxPoolSize
控制連線池大小,避免過多連線浪費資源。

錯誤處理:serverSelectionTimeoutMS, socketTimeoutMS
避免查詢卡住不回應。

網路設定:family: 4
強制 IPv4,避免 IPv6 連線失敗造成延遲。

  1. 建立連線
const connection = await mongoose.connect(mongoUri, options);

成功的話,connection 就是連線物件,接下來可以監聽事件。

  1. 事件監聽
mongoose.connection.on('connected', () => {
  console.log('✅ Mongoose connected to MongoDB');
});

mongoose.connection.on('error', (err) => {
  console.error('❌ Mongoose connection error:', err);
});

mongoose.connection.on('disconnected', () => {
  console.log('⚠️  Mongoose disconnected from MongoDB');
});

connected → 連線成功

error → 發生錯誤

disconnected → 連線中斷

讓我們能在 log 中清楚追蹤 DB 狀態。

  1. 處理程式結束
process.on('SIGINT', async () => {
  try {
    await mongoose.connection.close();
    console.log('Mongoose connection closed through app termination');
    process.exit(0);
  } catch (error) {
    console.error('Error closing mongoose connection:', error);
    process.exit(1);
  }
});

這段程式的重點在「優雅關閉」:

Ctrl + C 結束程式時,先關閉 MongoDB 連線,再結束程式。

避免遺留 zombie connection 造成資源浪費。

  1. 輔助函式
const closeDatabase = async () => {
  await mongoose.connection.close();
  console.log('Database connection closed successfully');
};

const isConnected = () => {
  return mongoose.connection.readyState === 1;
};

closeDatabase → 主動關閉連線。

isConnected → 檢查是否已連線(回傳布林值)。

readyState 對照表

狀態
0 disconnected
1 connected
2 connecting
3 disconnecting
  1. 模組輸出
module.exports = {
  connectDatabase,
  closeDatabase,
  isConnected
};

讓其他檔案能直接 require('./database') 使用。

  1. 延伸補充
    🔄 自動重試連線

實務上可能遇到 MongoDB 尚未啟動,這時候可以設計重試機制:

const connectWithRetry = async (retries = 3) => {
  for (let i = 0; i < retries; i++) {
    try {
      await connectDatabase();
      console.log('✅ MongoDB connected');
      break;
    } catch (err) {
      console.error(`Connection failed, retrying (${i + 1}/${retries})...`);
      await new Promise(r => setTimeout(r, 2000));
    }
  }
};

📂 .env 管理小提醒

.env 應該放在 .gitignore,避免洩漏敏感資訊。

可以提供 .env.example 方便其他人快速建立設定。

🧪 連線測試範例

(async () => {
  await connectDatabase();
  if (isConnected()) {
    console.log('MongoDB is ready to use!');
  }
})();

✅ 總結

這段程式碼實現了:

統一的資料庫連線管理(connectDatabase)

錯誤與狀態監聽(connected, error, disconnected)

優雅關閉(closeDatabase 與 SIGINT handler)

檢查連線狀態(isConnected)

延伸補充:重試機制、環境變數管理、連線測試

這樣就完成了 Rehab Tracker 專案中最基礎的資料庫連線設定 🎉


專案Github Repo : https://github.com/CHING-WENLAI1031/Rehab_Tracker


上一篇
🚀 Day 3: 專案基礎建設
下一篇
Day 5 分析 Server.js
系列文
30 天用 Vibe Coding 打造多角色復健追蹤應用5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言